var 와 let의 차이점

var 키워드의 단점을 보완하기 위해서 ES6에서 새로운 변수 선언 키워드인 let과 const가 추가 되었다.

  1. var 키워드에서는 동일한 이름의 변수를 중복 선언하였을대 아무런 에러가 발생하지않았다면 let 키워드는 SyntaxError가 발생한다.

  2. var로 선언된 변수는 오로지 함수의 코드블럭만을 지역스코프로 인정하는 함수 레벨 스코프를 따른다면 let으로 선언된 변수는 모든 코드 블록을 지역 스코프로 인정하는 블록 레벨 스코프를 따른다.

  3. var로 선언된 변수는 호이스팅 되지만 let으로 선언된 변수는 호이스팅되지 않는거 처럼 동작하게된다.

    이는 var에서는 선언 단계와 초기화 (undefined 주입)을 런타임 이전에 같이하기때문에 생기던 이슈인데
    let 키워드로 선언한 변수는 선언 단계와 초기화 단계가 분리 되어서 진행된다.

    선언 단계
    일시적 사각지대
    --ReferenceError--
    초기화 단계 ( let foo; foo == undefind)
    할당 단계 ( foo = 1; foo == 1)

    이렇게 실행되기때문에 호이스팅 되지않는 거 처럼 보이는것이다.

  4. var키워드로 선언한 전역 변수와 전역 함수 그리고 선언하지 않은 변수에 값을 할당한 암묵적 전역은 전역 객체 window의 프로퍼티가 된다.

    단 let으로 선언된 변수는 전역 객체의 프로퍼티가 아니다.